/* Copyright (c) 2017 Google Inc.
   Written by Andrew Allen */
/*
   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:

   - Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

   - Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "arch.h"
#include "float_cast.h"
#include "opus_private.h"
#include "opus_defines.h"
#include "mapping_matrix.h"

#define MATRIX_INDEX(nb_rows, row, col) (nb_rows * col + row)

opus_int32 mapping_matrix_get_size(int rows, int cols)
{
  opus_int32 size;

  /* Mapping Matrix must only support up to 255 channels in or out.
   * Additionally, the total cell count must be <= 65004 octets in order
   * for the matrix to be stored in an OGG header.
   */
  if (rows > 255 || cols > 255)
      return 0;
  size = rows * (opus_int32)cols * sizeof(opus_int16);
  if (size > 65004)
    return 0;

  return align(sizeof(MappingMatrix)) + align(size);
}

opus_int16 *mapping_matrix_get_data(const MappingMatrix *matrix)
{
  /* void* cast avoids clang -Wcast-align warning */
  return (opus_int16*)(void*)((char*)matrix + align(sizeof(MappingMatrix)));
}

void mapping_matrix_init(MappingMatrix * const matrix,
  int rows, int cols, int gain, const opus_int16 *data, opus_int32 data_size)
{
  int i;
  opus_int16 *ptr;

#if !defined(ENABLE_ASSERTIONS)
  (void)data_size;
#endif
  celt_assert(align(data_size) == align(rows * cols * sizeof(opus_int16)));

  matrix->rows = rows;
  matrix->cols = cols;
  matrix->gain = gain;
  ptr = mapping_matrix_get_data(matrix);
  for (i = 0; i < rows * cols; i++)
  {
     ptr[i] = data[i];
  }
}

#ifndef DISABLE_FLOAT_API
void mapping_matrix_multiply_channel_in_float(
    const MappingMatrix *matrix,
    const float *input,
    int input_rows,
    opus_val16 *output,
    int output_row,
    int output_rows,
    int frame_size)
{
  /* Matrix data is ordered col-wise. */
  opus_int16* matrix_data;
  int i, col;

  celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows);

  matrix_data = mapping_matrix_get_data(matrix);

  for (i = 0; i < frame_size; i++)
  {
    float tmp = 0;
    for (col = 0; col < input_rows; col++)
    {
      tmp +=
        matrix_data[MATRIX_INDEX(matrix->rows, output_row, col)] *
        input[MATRIX_INDEX(input_rows, col, i)];
    }
#if defined(FIXED_POINT)
    output[output_rows * i] = FLOAT2INT16((1/32768.f)*tmp);
#else
    output[output_rows * i] = (1/32768.f)*tmp;
#endif
  }
}

void mapping_matrix_multiply_channel_out_float(
    const MappingMatrix *matrix,
    const opus_val16 *input,
    int input_row,
    int input_rows,
    float *output,
    int output_rows,
    int frame_size
)
{
  /* Matrix data is ordered col-wise. */
  opus_int16* matrix_data;
  int i, row;
  float input_sample;

  celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows);

  matrix_data = mapping_matrix_get_data(matrix);

  for (i = 0; i < frame_size; i++)
  {
#if defined(FIXED_POINT)
    input_sample = (1/32768.f)*input[input_rows * i];
#else
    input_sample = input[input_rows * i];
#endif
    for (row = 0; row < output_rows; row++)
    {
      float tmp =
        (1/32768.f)*matrix_data[MATRIX_INDEX(matrix->rows, row, input_row)] *
        input_sample;
      output[MATRIX_INDEX(output_rows, row, i)] += tmp;
    }
  }
}
#endif /* DISABLE_FLOAT_API */

void mapping_matrix_multiply_channel_in_short(
    const MappingMatrix *matrix,
    const opus_int16 *input,
    int input_rows,
    opus_val16 *output,
    int output_row,
    int output_rows,
    int frame_size)
{
  /* Matrix data is ordered col-wise. */
  opus_int16* matrix_data;
  int i, col;

  celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows);

  matrix_data = mapping_matrix_get_data(matrix);

  for (i = 0; i < frame_size; i++)
  {
    opus_val32 tmp = 0;
    for (col = 0; col < input_rows; col++)
    {
#if defined(FIXED_POINT)
      tmp +=
        ((opus_int32)matrix_data[MATRIX_INDEX(matrix->rows, output_row, col)] *
        (opus_int32)input[MATRIX_INDEX(input_rows, col, i)]) >> 8;
#else
      tmp +=
        matrix_data[MATRIX_INDEX(matrix->rows, output_row, col)] *
        input[MATRIX_INDEX(input_rows, col, i)];
#endif
    }
#if defined(FIXED_POINT)
    output[output_rows * i] = (opus_int16)((tmp + 64) >> 7);
#else
    output[output_rows * i] = (1/(32768.f*32768.f))*tmp;
#endif
  }
}

void mapping_matrix_multiply_channel_out_short(
    const MappingMatrix *matrix,
    const opus_val16 *input,
    int input_row,
    int input_rows,
    opus_int16 *output,
    int output_rows,
    int frame_size)
{
  /* Matrix data is ordered col-wise. */
  opus_int16* matrix_data;
  int i, row;
  opus_int32 input_sample;

  celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows);

  matrix_data = mapping_matrix_get_data(matrix);

  for (i = 0; i < frame_size; i++)
  {
#if defined(FIXED_POINT)
    input_sample = (opus_int32)input[input_rows * i];
#else
    input_sample = (opus_int32)FLOAT2INT16(input[input_rows * i]);
#endif
    for (row = 0; row < output_rows; row++)
    {
      opus_int32 tmp =
        (opus_int32)matrix_data[MATRIX_INDEX(matrix->rows, row, input_row)] *
        input_sample;
      output[MATRIX_INDEX(output_rows, row, i)] += (tmp + 16384) >> 15;
    }
  }
}

const MappingMatrix mapping_matrix_foa_mixing = { 6, 6, 0 };
const opus_int16 mapping_matrix_foa_mixing_data[36] = {
     16384,      0, -16384,  23170,      0,      0,  16384,  23170,
     16384,      0,      0,      0,  16384,      0, -16384, -23170,
         0,      0,  16384, -23170,  16384,      0,      0,      0,
         0,      0,      0,      0,  32767,      0,      0,      0,
         0,      0,      0,  32767
};

const MappingMatrix mapping_matrix_soa_mixing = { 11, 11, 0 };
const opus_int16 mapping_matrix_soa_mixing_data[121] = {
     10923,   7723,  13377, -13377,  11585,   9459,   7723, -16384,
     -6689,      0,      0,  10923,   7723,  13377,  13377, -11585,
      9459,   7723,  16384,  -6689,      0,      0,  10923, -15447,
     13377,      0,      0, -18919,   7723,      0,  13377,      0,
         0,  10923,   7723, -13377, -13377,  11585,  -9459,   7723,
     16384,  -6689,      0,      0,  10923,  -7723,      0,  13377,
    -16384,      0, -15447,      0,   9459,      0,      0,  10923,
     -7723,      0, -13377,  16384,      0, -15447,      0,   9459,
         0,      0,  10923,  15447,      0,      0,      0,      0,
    -15447,      0, -18919,      0,      0,  10923,   7723, -13377,
     13377, -11585,  -9459,   7723, -16384,  -6689,      0,      0,
     10923, -15447, -13377,      0,      0,  18919,   7723,      0,
     13377,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,  32767,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
     32767
};

const MappingMatrix mapping_matrix_toa_mixing = { 18, 18, 0 };
const opus_int16 mapping_matrix_toa_mixing_data[324] = {
      8208,      0,   -881,  14369,      0,      0,  -8192,  -4163,
     13218,      0,      0,      0,  11095,  -8836,  -6218,  14833,
         0,      0,   8208, -10161,    881,  10161, -13218,  -2944,
     -8192,   2944,      0, -10488,  -6218,   6248, -11095,  -6248,
         0, -10488,      0,      0,   8208,  10161,    881, -10161,
    -13218,   2944,  -8192,  -2944,      0,  10488,  -6218,  -6248,
    -11095,   6248,      0,  10488,      0,      0,   8176,   5566,
    -11552,   5566,   9681, -11205,   8192, -11205,      0,   4920,
    -15158,   9756,  -3334,   9756,      0,  -4920,      0,      0,
      8176,   7871,  11552,      0,      0,  15846,   8192,      0,
     -9681,  -6958,      0,  13797,   3334,      0, -15158,      0,
         0,      0,   8176,      0,  11552,   7871,      0,      0,
      8192,  15846,   9681,      0,      0,      0,   3334,  13797,
     15158,   6958,      0,      0,   8176,   5566, -11552,  -5566,
     -9681, -11205,   8192,  11205,      0,   4920,  15158,   9756,
     -3334,  -9756,      0,   4920,      0,      0,   8208,  14369,
      -881,      0,      0,  -4163,  -8192,      0, -13218, -14833,
         0,  -8836,  11095,      0,   6218,      0,      0,      0,
      8208,  10161,    881,  10161,  13218,   2944,  -8192,   2944,
         0,  10488,   6218,  -6248, -11095,  -6248,      0, -10488,
         0,      0,   8208, -14369,   -881,      0,      0,   4163,
     -8192,      0, -13218,  14833,      0,   8836,  11095,      0,
      6218,      0,      0,      0,   8208,      0,   -881, -14369,
         0,      0,  -8192,   4163,  13218,      0,      0,      0,
     11095,   8836,  -6218, -14833,      0,      0,   8176,  -5566,
    -11552,   5566,  -9681,  11205,   8192, -11205,      0,  -4920,
     15158,  -9756,  -3334,   9756,      0,  -4920,      0,      0,
      8176,      0,  11552,  -7871,      0,      0,   8192, -15846,
      9681,      0,      0,      0,   3334, -13797,  15158,  -6958,
         0,      0,   8176,  -7871,  11552,      0,      0, -15846,
      8192,      0,  -9681,   6958,      0, -13797,   3334,      0,
    -15158,      0,      0,      0,   8176,  -5566, -11552,  -5566,
      9681,  11205,   8192,  11205,      0,  -4920, -15158,  -9756,
     -3334,  -9756,      0,   4920,      0,      0,   8208, -10161,
       881, -10161,  13218,  -2944,  -8192,  -2944,      0, -10488,
      6218,   6248, -11095,   6248,      0,  10488,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
     32767,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,  32767
};

const MappingMatrix mapping_matrix_fourthoa_mixing = { 27, 27, 0 };
const opus_int16 mapping_matrix_fourthoa_mixing_data[729] = {
      9243,      0,  16010,      0,      0,      0,  20669,      0,
         0,      0,      0,      0,  24456,      0,      0,      0,
         0,      0,      0,      0,  27731,      0,      0,      0,
         0,      0,      0,   9243,      0,  10884,  11741,      0,
         0,   3995,  17849,   9626,      0,      0,      0,  -5727,
     14399,  17315,   7625,      0,      0,      0,      0, -11747,
      2574,  18637,  15552,   5930,      0,      0,   9243, -14302,
     -2682,  -6677,  13337,   5357,  -9464,   2501, -11170,   4770,
     -5911,  11501,   5858,   5369,   4951,  17901, -19071,  -2397,
     -9281,  -9198,   7576,  -4294,   7773,  -8997,  -3399,      0,
         0,   9243,   9940,  11991,  -3705,  -5144,  16647,   7057,
     -6206,  -5941,  -2698, -10194,  16781,  -1788,  -6256, -11772,
      4935,   3912,  -6062, -13039,   9446,  -9758,  -3521, -15058,
     11089,    565,      0,      0,   9243, -15376,   3720,   2461,
     -5285,  -7989,  -8660,   1278, -16087,  15811,  -3249,  10500,
     -7757,  -1680,  -9890,  -8153,  10884,  11022,   2847,  12828,
      5137,  -2053,   8666,  -5684,  14776,      0,      0,   9243,
    -10577,  10304,  -6186,   9139, -15222,   2507,  -8902,  -5140,
      -145,  15562, -10596,  -7311,  -6197,  -8753,   8667,  -6014,
      -281,  15033,    938, -11859,    548,  -8456,  16735,  -3654,
         0,      0,   9243,   8974,   4839, -12343, -15472,   6066,
     -7501,  -8343,   5015,  15920, -12374,  -4559,  -9400,   6271,
      4011,   5191,  -9932,  14438,   4828,  -8768,   1909,  12059,
     -1565,   4707, -13711,      0,      0,   9243,  15799,   2085,
     -1534,  -3386,   4602,  -9808,   -447, -17267, -18054,  -1167,
    -13525,  -4644,   1313,  -5951,   5397,   7485,  -7056,   2584,
     -8120,   8669,    788,  13177,   2109,  18349,      0,      0,
      9243,  12371, -10036,   1597,   2760, -17341,   1848,  -2239,
    -10509,  -8474,  -4577,  11164,   7935,   1441,  17430,  -3436,
     -3713,  15936,   4184,   2647, -11730,    341, -15934,   6462,
      6581,      0,      0,   9243,  -8963,   2184,  13084, -16381,
     -2734,  -9757,   3991,   6345, -18297,  -5912,   7604,  -4849,
    -11100,   2290,  -4304, -13305,  -7488,  12338,   4805,   8505,
     -7014,  -4779,  -1761, -14597,      0,      0,   9243,   1301,
    -15498,   3799,    690,  -2816,  18718,  -8223,    889,    255,
     -1768,   4485, -19951,  13097,  -2278,    167,     78,   -740,
      3324,  -6139,  19488, -17925,   4283,   -486,     20,      0,
         0,   9243, -13470,  -6719,   5452, -10257,  12641,  -4873,
     -5116, -10595,   5856,  11389,   1502,  10876,   -608,  11765,
    -13218,  13911,  -7373,  -2070, -13679,  -4154,   5536,  -2138,
     16643,    451,      0,      0,   9243,   2455,  -3679, -15387,
     -5277,  -1261,  -8697,   7906,  16112,   8147,   3208,  -1690,
      7687,  10593,  -9796, -15852, -10884,  -5616,   2881,   2032,
      5246, -12735,  -8796,  10928,  14833,      0,      0,   9243,
     -6849,   2775, -14202,  13586,  -2655,  -9402,  -5505,  10809,
    -18013,   6231,   5444,  -6041,  11288,   4958,  -4078,  18799,
     -9368,  -9291,   4535,   7383,   9405,  -7391,  -2121,  -4336,
         0,      0,   9243,   6423,  -9040,  11548,  10359,  -8109,
      -450, -14580,   6431,  10857, -15475,   3569,   9707,   6416,
     -9607,    521,   8528, -18391,  11049,   3815, -10423,   6860,
      6860,   -883,  -4221,      0,      0,   9243,  11932,  -5968,
     -8850, -14749,  -9946,  -6026,   7377,  -4472,   5206,  14547,
     -3406,  10508,   2526,   4411,  14543,   8444,  -5822,    347,
     12347,  -1709,  -9158,    105, -16265, -12642,      0,      0,
      9243,  13044,   -150,   9282,  16910,   -274, -10332,   -194,
     -5864,   5428,   -420, -12196,    344,  -8679,    145, -18554,
    -12695,   -152, -14635,    503,  10389,    358,   5076,    522,
    -16100,      0,      0,   9243,  -8374, -13590,  -1221,   1428,
     15896,  12005,   2318,  -4793,   2590,  -3209, -20390,  -6256,
     -2974,  10766,   1202,   -876,  -6597,   5004,  19896,  -1541,
      2902, -16788,  -3062,   1340,      0,      0,   9243,   9879,
     10267,   7300,  10073,  14167,   2416,  10469,  -3094,   2899,
     17092,   9762,  -7400,   7214,  -5250,  -8238,  -3989,   5578,
     16392,  -1050, -11848,   -776,  -5034, -15850,  -5882,      0,
         0,   9243,  -4974,  -9068,  12221,  -8490,   6299,   -388,
    -15478,   8702,  -9920,  12723,  -2810,   9668,   6905, -13040,
      4325,  -9456,  16856,  -9159,  -2909, -10476,   7149,   9387,
     -7350,    233,      0,      0,   9243,   3627, -13823,  -7218,
     -3656,  -7002,  12776,  13935,   2719,   2446,   8352,   9252,
     -7676, -18413,  -6212,   -429,  -1272,  -6335, -13356,  -9510,
       295,  18926,   9934,   1112,   -382,      0,      0,   9243,
     -6383,  -9343, -11326,  10097,   8329,    223,  14780,   6114,
    -10348, -15590,  -4195,   9257,  -7445,  -9439,   -323,   7902,
     18117,  12101,  -3142, -10944,  -5577,   7327,    566,  -4133,
         0,      0,   9243,   2626,    865,  15769,   5783,    317,
    -10244,   1905,  16884,   9144,    826,  -2420,  -1972, -14536,
      2413,  16939,  12500,   1482,  -4906,   -578,  10096,  -3476,
    -14323,   2745,  16105,      0,      0,   9243,  -8975,  12086,
      5450,  -6832, -15149,   7333,   9200,  -3550,   -362, -13645,
    -15525,  -1391,   9428,  -7091,  -5442,   3105,   -820, -17685,
     -9175,  -9462,   5572,  -9191, -12325,  -2180,      0,      0,
      9243,   -114,  11576, -11058,    177,   -185,   5875, -17880,
      8539,   -198,    339,   -173,  -3411, -16698,  16336,  -6369,
       193,   -430,    408,    -75, -10806,  -7225,  19670, -13817,
      4665,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,  32767,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
     32767
};

const MappingMatrix mapping_matrix_fifthoa_mixing = { 38, 38, 0 };
const opus_int16 mapping_matrix_fifthoa_mixing_data[1444] = {
      9243,      0,  16010,      0,      0,      0,  20669,      0,
         0,      0,      0,      0,  24456,      0,      0,      0,
         0,      0,      0,      0,  27731,      0,      0,      0,
         0,      0,      0,      0,      0,      0,  30657,      0,
         0,      0,      0,      0,      0,      0,   9243,      0,
     -7023,  14387,      0,      0,  -4369, -14112,  14455,      0,
         0,      0,  10931,   -510, -16777,  14031,      0,      0,
         0,      0,  -5118,  14286,   4343, -18465,  13374,      0,
         0,      0,      0,      0,  -6494, -12221,  11761,   8513,
    -19458,  12605,      0,      0,   9243, -14128,   5093,   5547,
    -10946, -10050,  -7197,   3945, -11790,   7142,  -9213,   6529,
     -9701,  -2563,  -9923, -14846,  16521,   6816,   2764,  14103,
      1118,  -5537,   2977, -14168,   1228,   4866,  17430,   -528,
     10639,   2641,  10437,  -1037,  11460,   1098,   1296,  15737,
         0,      0,   9243,   1128, -14775,   6062,    955,  -2329,
     16069, -12511,   2477,    579,  -2333,   3440, -14197,  18478,
     -6050,    940,    303,  -1604,   4106,  -4223,   9829, -22688,
     10647,  -2604,    334,    145,   -927,   3203,  -6017,   4507,
     -3812,  24212, -15600,   5198,  -1023,    110,      0,      0,
      9243,   1158,  12997,   9277,   1501,   2103,  10097,  16840,
      5916,   1402,   3225,   2488,   2929,  19916,  12706,   3585,
      1137,   3415,   4698,   2078,  -5442,  16634,  18511,   8731,
      2095,    850,   3061,   5733,   5225,    960, -11728,   7689,
     20588,  14659,   5642,   1187,      0,      0,   9243,  -4663,
     -3081, -15003,   9771,   2007,  -9185,   6457,  14199, -14357,
     -4976,   3554,   6625,  11434,  -7231, -11297,  17760,   8291,
     -6267,  -3368,   6712, -10837,  -9107,   6524,   6793, -19531,
    -11338,   7934,   7335,  -2205,  -9215,  -7094,  10659,   6243,
     -4337,  -1250,      0,      0,   9243, -13515,   7679,  -3831,
      7232, -14496,  -3201,  -4109, -11731,   8828,   9178,  -1901,
    -10848,   -539, -14888,   9626, -10860,  12703,   3824,  12334,
     -7104,   3496,  -6203,  13852,   5461,  -2109, -17277,   7837,
     -4714,  13901,   4097,   3940,   7647,   8546,   8688, -10986,
         0,      0,   9243,   8113,  -9860,   9657,  10943, -11174,
      1426, -13300,   1915,   8178, -17833,   6805,   8309,   8100,
     -3121,  -4742,   2683, -15111,  15688,   2358, -11590,   2807,
      2746,   8762,  -7430,  -2251,  -5481,  16370,  -4081,  -9694,
      5872, -11539,   -714,  -9492,  15177,  -6126,      0,      0,
      9243,   9933,  -9215,  -8528, -11831, -12785,    -62,  10976,
     -1811,   5593,  18018,   6100,   9455,  -5237,   2758,   8971,
      2743,  -9659, -13517,   5330, -10737,  -4576,  -2069, -15491,
     -8749,  -7226,  -5237,   9191,   -181, -12277,   2815,  10540,
       -27,  14741,  16703,   3103,      0,      0,   9243, -10067,
     -8881,  -8723,  12265,  12487,   -793,  10821,  -1762,  -6021,
    -18002,  -5072,   9912,  -4395,   2587,   9368,  -2767,  10021,
     12259,  -6468, -10113,  -5605,  -1761, -15590,  -9430,   7800,
      5092,  -8835,   2293,  12314,   1222,  10671,   -329,  13745,
     17349,   3563,      0,      0,   9243,  -6485,  12991,  -6743,
      6108, -11768,  10080, -12236,    238,  -2883,  13115, -13907,
      2900, -14460,    511,   2564,    186,  -7019,  19094, -11597,
     -5472, -12058,    744,   6243,  -2384,    930,    501, -11778,
     21214,  -5330, -11746,  -5542,    827,  10475,  -6418,   1132,
         0,      0,   9243,   3862,   5238, -14627,  -7891,   2826,
     -7015, -10701,  13900,  11410,  -6831,  -1679,  -9861,   6359,
     12032, -11660, -14041,  11199,   1713,  -3895,    657,  14749,
     -3017, -11445,   8380,  15575, -15236,   -346,   7690,   -923,
     10317,   3498, -13545,    354,   9093,  -4476,      0,      0,
      9243,  -8417,  13183,   3418,  -4018, -15498,  10685,   6294,
     -4132,   1419,  -8755, -18818,   3926,   7642,  -9001,  -3235,
      2125,   3506, -13037, -16570,  -4337,   6729, -13404,  -7991,
        59,    443,   5804,   6005, -15011,  -9060, -11044,   3679,
    -15434, -13685,    161,   1185,      0,      0,   9243,  -5288,
      6773, -13508,   9977,  -5002,  -4784, -12780,  10790, -12942,
     11168,    519, -10890,   1326,  12078,  -6274,  13780, -16427,
      2186,   5352,  -4328,  13671,   2364,  -7963,   1080, -12568,
     19336,  -6557,  -8574,   4084,   7277,  10433,  -9273,  -3178,
      1516,   3817,      0,      0,   9243,   9660,   7817,  10093,
     13619,  10548,  -2942,  11021,    597,   9663,  17594,   1736,
    -10794,   1814,    771,  -8469,   1041,  14155,   7891,  -8597,
     -7498,  -8982,    346, -12407, -11848,  -6809,   1686,   9181,
     -8306, -10247,   3538, -10706,   -364,  -8047, -19188,  -8493,
         0,      0,   9243,  -7163,  -1020,  14282, -14289,   1021,
    -10208,  -2036,  10660, -18919,   2410,   6564,   2323, -13088,
     -1798,   3365, -19498,   3619,  12022,  -1858,   9978,   3705,
     -8969,   -643,  -5794, -15523,   4123,  15113,  -3949,  -6265,
     -3596,  12490,   2946,  -2688,   1225, -14570,      0,      0,
      9243, -12187,    772, -10354,  17623,  -1314, -10262,  -1117,
     -2885,  -9937,   2249,  11267,  -1763,   9572,   -368,  16506,
     -6510,  -1438, -15014,   2402,  10157,   2041,   2458,   2389,
    -19346,  19860,  -1041,   8067,  -3704, -10931,   2743,  -9286,
       606, -13399,  -3095,   7924,      0,      0,   9243,  15545,
     -2367,  -3011,  -6538,  -5139,  -9657,    995, -16242, -15706,
      2557, -12952,   5226,   2508,   6353,  10156,  13593,   6966,
      4795,   8960,   8183,  -1735,  11914,  -4504,  14149,  11727,
     -6665,  10460,  -3962,  10145,  -7648,  -1965,  -9845,  -6764,
     -6938, -16633,      0,      0,   9243,   3098,  12983,  -8841,
     -3826,   5618,  10053, -16031,   4787,   3283,  -8209,   6632,
      2856, -18922,  10272,  -2055,  -2344,   7987, -11939,   5516,
     -5520, -15739,  14940,  -5001,    530,   1465,  -6306,  13388,
    -13243,   2513, -11772,  -7170,  16572,  -8384,   1426,    168,
         0,      0,   9243, -15767,  -2008,  -1916,   4220,   4422,
     -9846,    537, -17105,  17650,  -1400,  13589,   4481,   1651,
      5677,   6701,  -9241,  -6642,  -3252,  -7827,   8792,   -951,
     13182,  -2522,  17586, -17005,   3845, -12562,   2213, -11472,
     -6688,  -1394,  -8970,  -4769,  -7316, -11753,      0,      0,
      9243, -13344,  -3829,   7975, -14863,   7136,  -8561,  -4265,
     -7992,   -801,   9405,   8912,   7937,  -5326,   5057, -17681,
     15207,    575,   7717, -11360,   4847,   6789,   4150,  12686,
    -10050,  16730, -12063,    322, -12920,  -3313, -10267,   1980,
     -6948,   7112,   7972,   8042,      0,      0,   9243,   7791,
     -1021,  13949,  15180,  -1111, -10208,  -1989,   9348,  19199,
     -2561,  -7140,   2323, -12782,  -1577,    817,  18164,  -3673,
    -12771,   2022,   9978,   3620,  -7865,   -156,  -9155,  11924,
     -3842, -15336,   4196,   6814,  -3596,  12199,   2583,   -652,
      1936, -17637,      0,      0,   9243,  -4810, -15144,  -1958,
      1315,  10175,  17406,   4142,  -1348,    263,  -3292, -15632,
    -17046,  -6363,   3374,    605,   -227,   -748,   5997,  20334,
     14481,   8277,  -6146,  -1717,      5,     27,    712,   1542,
     -9197, -23572, -10163,  -9595,   9425,   3539,    -17,    -72,
         0,      0,   9243,  -7366,   8261,  11568, -11901,  -8499,
     -2079,  13347,   5556, -12049, -16247,  -2282, -10529,   3584,
      7585,  -1577,  -8464, -18652,  -8902,   5913,  -8688,  -9287,
      4156,  -2442,  -7089,  -2993, -14485, -13949,   5422,   8459,
      1638, -13285,  -2531,  -1826, -12132,  -9456,      0,      0,
      9243,  11716,    698, -10889, -17818,   1143, -10275,  -1062,
     -1305,  12057,  -2057, -10855,  -1595,  10088,   -150,  15043,
      2978,   1578,  15225,  -2090,  10201,   1943,   1115,   1969,
    -20211, -17636,    430,  -9826,   3391,  10572,   2485,  -9826,
       248, -12259,  -2924,  12131,      0,      0,   9243,   4361,
     -4594, -14703,  -8956,  -2798,  -7781,   9434,  13769,  12936,
      6800,  -2400,   9082,   8091, -10453, -11023, -15786, -11136,
      3285,   4153,   2658, -14002,  -5051,   9489,   7000,  17206,
     15024,  -2777,  -8491,    -42, -10626,    141,  13053,   2366,
     -6662,  -2231,      0,      0,   9243,   -752, -11933, -10646,
      1119,   1254,   6890,  17745,   7875,  -1203,  -2207,  -1251,
      2024, -17706, -15532,  -5600,   1128,   2691,   2800,    683,
     -9927,   9661,  19706,  12522,   3889,   -978,  -2789,  -3992,
     -2440,    206,  12695,   2921, -17173, -18575,  -9616,  -2657,
         0,      0,   9243,   4791, -15001,  -2887,  -1931, -10037,
     16885,   6048,  -1020,     46,   4789,  15191, -15922,  -9154,
      2530,    823,    252,   -130,  -8608, -19335,  12613,  11651,
     -4549,  -2314,   -172,   -101,   -784,    265,  12975,  21741,
     -7551, -13101,   6856,   4710,    535,    -46,      0,      0,
      9243, -12153, -10395,    754,  -1281,  17644,   2735,  -1095,
    -10274,   8359,   2200, -12593,   7083,    782,  17650,  -1573,
      1685, -16282,  -2164,   -530, -11878,     32, -17359,   3065,
      6651,  -5212,  -3628,  19365,    965,  13180,   8243,   -818,
      7746,  -3645, -14323,   1670,      0,      0,   9243,  -6961,
    -11198,   9081,  -8829,  10887,   4833, -14202,   2374,  -6524,
     16339,  -9417,   4737,  12284,  -4394,  -2691,  -2683,  13690,
    -18539,   2830, -11438,  -3692,   4985,   5648,  -4628,    514,
      6225, -18409,  12672,   5311,  11170,  -6928,  -3407,  -7595,
     10737,  -3977,      0,      0,   9243,  12099, -10405,   1294,
      2187, -17582,   2760,  -1880, -10105,  -8058,  -3760,  12583,
      7058,   1346,  17376,  -2667,  -2829,  15710,   3705,    468,
    -11880,     50, -17123,   5201,   6230,   4698,   6098, -18716,
     -1665, -13088,   8285,  -1400,   7696,  -6196, -13429,   2770,
         0,      0,   9243,   8602,  13392,   1722,   2070,  16090,
     11359,   3222,  -4960,  -2638,   4581,  20106,   5099,   4026,
    -10978,  -1778,  -1314,  -6620,   6988,  18701,  -2965,   3745,
    -16745,  -4461,   1300,    584,  -3646, -11588,   8350,  11847,
    -10050,   2372, -20010,  -7809,   3608,    887,      0,      0,
      9243,  14252,  -1958,   7026,  13986,  -3899,  -9870,  -1922,
    -10736,  -3693,  -4527, -12333,   4376,  -6080,   3475, -18537,
    -19222,   1355, -10843,   6913,   8869,   3408,   8323,   6804,
     -5141, -13648,   7800,   2649,   7171,  10505,  -6548,   5179,
     -5505,  13299,   2086,  15579,      0,      0,   9243,  11323,
      9021,  -6835, -10810,  14267,   -489,  -8613,  -5689,    639,
    -16117,   6224,  -9731,  -3757,  -8482,  10882,   7873,   1080,
    -11447,  -6791, -10388,   4099,  -6025,  18396,  -5407,  -7536,
     14714,    984,   1267, -13940,  -1889,   8416,    666,  16762,
    -10106,  -3418,      0,      0,   9243,    871,   4833,  15238,
      1855,    588,  -7508,  10287,  16162,   2857,   1481,   -443,
     -9392,  -7758,  12910,  16506,   3837,   2588,   -581,   -851,
      1928, -14879,  -5066,  14950,  16498,   4773,   3842,   -425,
     -1785,    -82,  10578,  -1435, -15554,  -2459,  16520,  16250,
         0,      0,   9243,  14762,   5967,   1673,   3450,  12303,
     -6027,   1394, -15022, -14571,   3402,  -4217, -10507,   -478,
    -14813,  -5131,  -6634, -16293,    -82, -15276,  -1705,  -1731,
       358,  -5738,  13681,  12503,  -8200,  -3023,  -3290,  -7384,
      9272,   -837,  14328,  -1064,  16913,   7915,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,  32767,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,  32767
};

const MappingMatrix mapping_matrix_foa_demixing = { 6, 6, 0 };
const opus_int16 mapping_matrix_foa_demixing_data[36] = {
     16384,  16384,  16384,  16384,      0,      0,      0,  23170,
         0, -23170,      0,      0, -16384,  16384, -16384,  16384,
         0,      0,  23170,      0, -23170,      0,      0,      0,
         0,      0,      0,      0,  32767,      0,      0,      0,
         0,      0,      0,  32767
};

const MappingMatrix mapping_matrix_soa_demixing = { 11, 11, 3050 };
const opus_int16 mapping_matrix_soa_demixing_data[121] = {
      2771,   2771,   2771,   2771,   2771,   2771,   2771,   2771,
      2771,      0,      0,  10033,  10033, -20066,  10033,  14189,
     14189, -28378,  10033, -20066,      0,      0,   3393,   3393,
      3393,  -3393,      0,      0,      0,  -3393,  -3393,      0,
         0, -17378,  17378,      0, -17378, -24576,  24576,      0,
     17378,      0,      0,      0, -14189,  14189,      0, -14189,
    -28378,  28378,      0,  14189,      0,      0,      0,   2399,
      2399,  -4799,  -2399,      0,      0,      0,  -2399,   4799,
         0,      0,   1959,   1959,   1959,   1959,  -3918,  -3918,
     -3918,   1959,   1959,      0,      0,  -4156,   4156,      0,
      4156,      0,      0,      0,  -4156,      0,      0,      0,
      8192,   8192, -16384,   8192,  16384,  16384, -32768,   8192,
    -16384,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,   8312,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
      8312
};

const MappingMatrix mapping_matrix_toa_demixing = { 18, 18, 0 };
const opus_int16 mapping_matrix_toa_demixing_data[324] = {
      8192,   8192,   8192,   8192,   8192,   8192,   8192,   8192,
      8192,   8192,   8192,   8192,   8192,   8192,   8192,   8192,
         0,      0,      0,  -9779,   9779,   6263,   8857,      0,
      6263,  13829,   9779, -13829,      0,  -6263,      0,  -8857,
     -6263,  -9779,      0,      0,  -3413,   3413,   3413, -11359,
     11359,  11359, -11359,  -3413,   3413,  -3413,  -3413, -11359,
     11359,  11359, -11359,   3413,      0,      0,  13829,   9779,
     -9779,   6263,      0,   8857,  -6263,      0,   9779,      0,
    -13829,   6263,  -8857,      0,  -6263,  -9779,      0,      0,
         0, -15617, -15617,   6406,      0,      0,  -6406,      0,
     15617,      0,      0,  -6406,      0,      0,   6406,  15617,
         0,      0,      0,  -5003,   5003, -10664,  15081,      0,
    -10664,  -7075,   5003,   7075,      0,  10664,      0, -15081,
     10664,  -5003,      0,      0,  -8176,  -8176,  -8176,   8208,
      8208,   8208,   8208,  -8176,  -8176,  -8176,  -8176,   8208,
      8208,   8208,   8208,  -8176,      0,      0,  -7075,   5003,
     -5003, -10664,      0,  15081,  10664,      0,   5003,      0,
      7075, -10664, -15081,      0,  10664,  -5003,      0,      0,
     15617,      0,      0,      0,  -6406,   6406,      0, -15617,
         0, -15617,  15617,      0,   6406,  -6406,      0,      0,
         0,      0,      0, -11393,  11393,   2993,  -4233,      0,
      2993, -16112,  11393,  16112,      0,  -2993,      0,   4233,
     -2993, -11393,      0,      0,      0,  -9974,  -9974, -13617,
         0,      0,  13617,      0,   9974,      0,      0,  13617,
         0,      0, -13617,   9974,      0,      0,      0,   5579,
     -5579,  10185,  14403,      0,  10185,  -7890,  -5579,   7890,
         0, -10185,      0, -14403, -10185,   5579,      0,      0,
     11826, -11826, -11826,   -901,    901,    901,   -901,  11826,
    -11826,  11826,  11826,   -901,    901,    901,   -901, -11826,
         0,      0,  -7890,  -5579,   5579,  10185,      0,  14403,
    -10185,      0,  -5579,      0,   7890,  10185, -14403,      0,
    -10185,   5579,      0,      0,  -9974,      0,      0,      0,
    -13617,  13617,      0,   9974,      0,   9974,  -9974,      0,
     13617, -13617,      0,      0,      0,      0,  16112, -11393,
     11393,  -2993,      0,   4233,   2993,      0, -11393,      0,
    -16112,  -2993,  -4233,      0,   2993,  11393,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
     32767,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,  32767
};

const MappingMatrix mapping_matrix_fourthoa_demixing = { 27, 27, 0 };
const opus_int16 mapping_matrix_fourthoa_demixing_data[729] = {
      4870,   4484,   4870,   4347,   4440,   4726,   4683,   4821,
      4883,   4842,   4603,   4484,   4683,   4698,   4234,   4368,
      4603,   4783,   4783,   4820,   4821,   4347,   4820,   4440,
      4698,      0,      0,    101,     84,  -7818,   4640,  -7178,
     -5492,   4629,   8384,   6547,  -4966,    617,  -6345,   1061,
     -3241,   2939,   5549,   6390,  -4434,   4994,  -2610,   1993,
     -2873,   1547,  -4356,   -164,      0,      0,   8797,   5074,
     -1553,   5383,   1906,   5297,   2722,   1158,  -5226,   1311,
     -7760,  -3327,  -1940,   1586,  -4093,  -2951,   -214,  -6873,
      5450,  -4875,  -7193,  -4438,    558,   5593,   5607,      0,
         0,    -26,   5761,  -3723,  -1460,   1195,  -3065,  -6357,
     -1175,    608,   6965,   2310,   2759,  -8023,  -7138,   5162,
     -3624,   5006,   -809,   3592,   6209,  -4159,  -4968,   8150,
      2513,  -5702,      0,      0,    301,    109,   7161,  -2462,
     -2443,   5044,  -7125,  -2256,   1967,  -9107,    259,  -4928,
     -2592,   6514,   4111,  -7236,   8695,    635,   5009,  -4025,
     -1937,   4794,   3420,  -3507,   -400,      0,      0,   -134,
        85,   2771,   7842,  -3649,  -8225,   2866,   2586,  -9200,
     -1945,  -1563,   6155,   -720,  -1061,  -3494,  -4513,   -487,
      8389,   7317,   3348,  -3721,   3806,    371,  -6896,     70,
         0,      0,  10919,   2072,  -4867,   3472,  -4429,   1721,
     -4066,  -5193,   1032,  -5253,   9501,  -2017,  -3971,  -5261,
      -306,  -2737,  -5137,   5713,   1237,     -8,   6387,    364,
     -5423,   3364,   2888,      0,      0,    -48,   8946,   1048,
     -2691,    602,  -4332,  -4302,   -514,  -1730,   2459,  -4328,
     -2156,   3335,  -2748,  -6029,   4023,    155,    897,   5268,
     -8380,   7625,   7395,    508,   3945,  -8951,      0,      0,
        39,   4151,  -5965,  -3398,  -7006,  -3534,   2697,  -8989,
     -5237,   2913,     46,  -5540,   8196,   5766,   2711,  -2520,
     -3043,  -2146,   -948,   4965,   1806,   2472,   8988,  -1266,
      4840,      0,      0,   -407,   -189,   2179,  -1627,   6516,
       259,   7196,  -9449,  -4905,  -9766,    561,   4021,   3371,
     -8650,   5032,   3329,   2534,    641,   2224,  -5747,   1047,
     -4074,   5252,    -24,    674,      0,      0,    664,    237,
     -2837,  -4072,  -1205,   8252,  -5875,  -1670,  -2743,  -3984,
       381,   5059,   1765,   2666,  -8295,   7403,   1154,  -2086,
      7622,   7105,   3677,  -6943,   1050,  -6632,   -694,      0,
         0,    382,   -133,   5699,   7650,   5154,  -5713,  -1645,
     -6902,   6181,   4450,   1151,    410,   -993,   3829,   2444,
     -2405,  -6618,  -9514,   5366,  -1896,   5844,  -2886,  -1524,
     -7321,  -1007,      0,      0,  12767,  -2530,   3183,  -1409,
     -4015,  -2894,  -5155,  -1710,   3841,  -2107, -10274,   5119,
      3979,  -4010,   5550,   4822,   -746,  -2507,  -3080,   4289,
     -3675,   4333,  -1416,  -1230,  -1122,      0,      0,     17,
      8048,   2398,  -2167,    -73,  -3606,   3125,    398,    731,
     -5973,   5705,  -1032,   4679,   7305,   3134,   1301,  -3858,
       -89,   2938,   4359,  -9155,  -4805,  -8407,   3673,  -8645,
         0,      0,    187,   7355,   3145,  -6719,  -4432,  -5939,
      2541,  -2810,   9723,    778,  -1105,   5687,  -4174,   2534,
     -4461,   1017,   -244,   5481,  -1655,  -6765,  -3350,  -4894,
      1592,  -2318,   8827,      0,      0,    196,   3588,   9631,
      3063,  -4564,   6043,   2683,   2595,  -2488,  -2186,    173,
     -6059,  -8270,  -2386,    409,   7441,  -8608,    376,  -4364,
      2321,   -280,     97,   8331,  -3022,  -4721,      0,      0,
       117,   -748, -10833,   1533,   4200,  -2875,   -997,   -109,
     -3661,  -6119,   4454,   8808,  -9189,   8294,   1521,   7265,
     -2348,  -5094,   -948,  -5400,  -3193,   8914,   5763,   1716,
     -1070,      0,      0,   2497,    399,  -5201,  -2038,   7843,
      -376,   7567,  -5073,   7616,  -5537,   2086,  -3453,  -5544,
       -56, -11648,  -1314,   3546,  -3432,   -117,   8694,  -4245,
      9621,   3098,  -2582,  -2351,      0,      0,   4386,  -3104,
     -3132, -10512,    566,   5217,   5128,   4967,   1348,   7035,
     -1470,     91,   -125,  -3548,   8244,  -3029, -10033,   2186,
      9745,  -6440,  -2074,   3638,  -1477,  -7045,   -562,      0,
         0,   2154,   8116,  -6102,   6570,  12998,   -712,  -4126,
     -4996,     30,   1571,  -6393, -12794,    425,   5036,   1190,
      5763,   5653,  12933,  -6671,   5197,  -2964,  -3316,  -6354,
    -10554,  -2652,      0,      0,  12618,  -3737,     93,  -5901,
      4262,  -3364,   4444,   3103,  -2767,   3403,   4925,  -2584,
      -989,   4977,  -3714,  -1965,   3076,    326,  -2946,  -2568,
      1026,  -2980,   3362,  -6132,  -5966,      0,      0,   6001,
        48,  -1979,  -7275,   3476,  -2096,  10591,   3793,   2629,
      -447, -14747,  -3689,  -5525,   8358,   6883,  -9703,  -4556,
      7471,   2965,   4056,  13221,  -7327,  -3073,  -2353,  -6720,
         0,      0,    621,  11034,    -44,  -2828,   5978,  -1850,
     -1772,   3894,  -7471,  -1397,    945,  -2028,  -2928,  -2240,
      3172,   2222,   4544,  -4243,  -5645,   3745,   2573,   3511,
     -8206,  -7286,   5700,      0,      0,    321,  10818,  -4982,
      7813,   -749,   9907,   1360,  -1443,    568,  -1103,   2305,
      6045,   2270,  -1063,  -1920,  -3073,   5893,  -3476, -11346,
     -1657,   -588,   2957,  -2287,  -8527,  -8041,      0,      0,
       119,   -268,   2372,  -3040,   4979,  -3789,  -5630,  10619,
      5900,  -5109,  -4585,  -3862,  10467,  -3527,   -385, -10034,
     -9991,   4860,    984,   2362,   2311,  -6804,   6324,    433,
      5291,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,  32767,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
     32767
};

const MappingMatrix mapping_matrix_fifthoa_demixing = { 38, 38, 0 };
const opus_int16 mapping_matrix_fifthoa_demixing_data[1444] = {
      3188,   3247,   3268,   3368,   3368,   3138,   3268,   3099,
      3211,   3368,   3099,   3247,   3211,   3368,   3368,   3368,
      3149,   3268,   3247,   3211,   3099,   3188,   3138,   3149,
      3099,   3188,   3368,   3149,   3188,   3247,   3268,   3138,
      3211,   3368,   3138,   3149,      0,      0,    118,    -47,
     -5011,    282,    333,  -1497,  -4584,   2908,   3388,  -3647,
     -2493,   1139,  -2882,  -1719,   3604,  -2543,  -4328,   5443,
      1286,  -5498,  -4583,   2510,  -1743,  -2556,   4168,   1446,
      -290,   1812,  -4074,  -2377,   4152,   2847,   4991,   3980,
       393,   5072,      0,      0,   5489,  -2235,   1507,  -5326,
      4609,  -1096,   2926,  -3427,  -3301,  -3078,   4226,   1730,
      4627,   2561,   2966,   -592,    143,   -677,   4617,   -755,
      -956,   -433,  -5138,   3037,    157,  -1394,  -4498,  -4984,
     -3661,  -4112,  -3756,   4628,   -570,   3356,   1605,   1803,
         0,      0,   -162,   5162,   2132,   2392,   3556,  -5141,
     -1536,   2975,  -3001,  -3350,  -2231,  -5230,   1294,  -4965,
      3494,   5230,  -3292,  -1359,  -2945,   -773,   2670,   4867,
      -660,   3720,  -3415,  -5112,  -3700,  -1211,    407,   3013,
       763,    591,   2481,  -2657,   5210,    784,      0,      0,
      -156,    338,  -4246,    510,    462,   3296,   2846,   3333,
     -4292,   4574,   1940,  -2986,  -1275,   3701,   5022,  -5250,
      5780,  -2676,  -1180,   1516,  -4852,   4877,    342,  -3923,
     -5703,  -2920,    379,   -657,   -361,  -3346,   1044,    795,
      5257,  -4004,    698,   1115,      0,      0,     47,   -140,
     -3292,  -1097,    652,    855,  -5260,  -3691,  -4470,   4521,
     -3863,   1093,  -5552,  -2016,   3831,    334,   -456,  -1532,
      2068,   1788,   2054,   -295,   3668,  -2820,    328,   -994,
       295,  -3301,   5770,   4282,  -6353,   5632,  -1371,   5005,
       238,   4041,      0,      0,   6764,  -1659,  -2730,   5726,
      3715,  -3216,   -933,    531,    -52,   -345,   3022,  -2818,
      4005,  -1617,  -1189,  -3748,  -3403,  -3592,   4040,  -3553,
     -2806,  -3444,   6023,   -711,  -3298,  -2503,   2548,   5564,
       940,   1848,   1207,   4010,  -3488,   -358,  -2511,  -1966,
         0,      0,    -64,  -5039,   1403,  -4455,   6240,   2189,
     -1716,  -4348,   4183,   3951,  -4042,  -3606,   2399,  -4563,
      4050,   -612,   -395,    348,  -5791,    391,  -1440,   -735,
      1398,   4359,   -518,   2969,   6556,   1951,   -518,  -4993,
      -925,    998,   -569,  -2934,   3460,    420,      0,      0,
        16,   5482,  -4122,    770,   2082,   5020,  -3961,    485,
      -584,   -793,      3,   5222,  -1416,   3673,     78,   3549,
      -937,  -5723,   1673,  -6162,  -2540,   3082,   -355,   1838,
      -615,   4601,   2832,   -359,  -3346,    668,  -3393,  -1583,
     -3774,  -2206,   5754,  -4961,      0,      0,   -328,    299,
      2470,    317,    525,  -4494,   2805,   2617,   2383,  -2363,
     -1037,   4085,    895,  -4622,   3218,  -6607,  -3381,  -5933,
      1397,   6394,   -446,   5694,     14,  -4510,   4329,   3690,
      -334,      0,   2932,  -2478,  -2944,   -577,   -599,   -230,
      1553,  -4736,      0,      0,   -324,    142,  -3252,   -867,
      1111,  -1882,   3378,  -6055,   6502,  -6840,   4280,  -2694,
     -2876,   4190,   6454,    655,   1061,    626,  -2669,   -798,
      3192,   -985,   -898,  -5482,   -548,   2315,   -558,   1302,
       900,   5747,  -1325,   1599,  -1384,  -5749,    624,   1110,
         0,      0,    321,    312,   2188,   1322,    237,    708,
      -304,   2463,   1500,  -1094,  -5112,  -1010,  -6799,    646,
       992,   1969,   3423,  -3996,   2628,   4451,   3432,  -2833,
     -6101,   -330,  -3768,     -3,   -707,   5961,  -4037,  -3736,
      4080,   7254,  -4113,   2151,     54,  -2150,      0,      0,
      7735,   4064,  -3884,  -5240,    577,   2229,  -3947,   2914,
      3555,   4011,    774,  -3519,   1985,  -3701,  -3824,    330,
      -905,   2085,   1155,   2176,   3006,    340,  -5533,  -3264,
      -902,   3114,    344,  -5060,   1524,   1805,   1926,   2350,
      1905,  -3203,  -2762,  -4162,      0,      0,    193,   -151,
     -1434,   6289,   7354,   4234,    169,   2868,  -1977,  -1375,
     -4987,   2345,   2742,    599,    939,  -4837,   2688,    991,
     -6907,    716,  -1542,  -4346,  -1833,   1493,   3134,   2903,
     -7019,  -2835,     93,   4395,    621,    870,  -2357,   -975,
     -2933,   -127,      0,      0,   -616,  -5968,  -3479,  -1651,
      4932,  -2445,  -5512,  -1451,    691,    739,    479,   4227,
     -2886,   3853,      8,   -501,    188,   1990,   3842,   2270,
      1662,   -174,   1290,   2456,     67,  -3267,  -5535,    483,
      5721,  -1642,   6501,  -3432,   1184,  -3246,   4101,  -4880,
         0,      0,   -465,   5264,  -4812,    682,   1683,  -4539,
      2916,  -1985,   2899,   3324,   1060,  -4398,   -745,  -2137,
     -3827,   1044,   6225,   3609,   -532,   1980,  -6001,    564,
      -209,  -1299,   5336,  -3605,  -1484,     37,     19,  -1295,
      -665,   -385,  -6773,   3651,   6153,  -1291,      0,      0,
       193,   -415,   5166,   -110,    626,   6743,  -2860,   1425,
      1101,  -1341,     80,  -4533,    249,   4231,   -119,  -6009,
     -2970,   5170,   -822,  -2610,   4527,   5948,    182,  -2589,
       837,  -5471,    371,    -43,    373,   -665,  -1233,   -626,
     -7353,   2606,   1339,  -1398,      0,      0,   -533,    147,
      2075,   -672,   1043,   3503,   4402,  -4971,  -3287,   3731,
     -2606,   3817,   1972,  -5603,   5114,   1185,  -1318,   1906,
      3018,  -1999,    343,  -1943,    207,  -6744,    913,  -4060,
       645,   -349,  -5667,   4766,   5575,  -1733,   1116,    160,
      1534,  -5690,      0,      0,   -137,    -36,   1556,   1325,
      1553,  -2230,   1188,   5296,  -5104,   4673,   6295,    498,
     -4723,    933,   2994,   4067,  -4700,   1758,  -4116,  -1252,
      2444,  -4092,   1653,  -2802,   5069,   1133,    790,  -2355,
      -934,  -6304,   1642,   2045,  -4259,  -3873,   -213,    215,
         0,      0,   -364,    423,   4888,  -1316,    118,   -950,
      4027,    114,   2961,  -3136,  -3012,   -883,  -6192,   1340,
     -3210,  -1193,   1376,   3128,   1596,  -2994,  -3194,    533,
      8502,   2487,  -1485,   1032,    301,  -8007,   -577,    887,
       297,   7778,   3121,  -1901,    -94,  -6401,      0,      0,
      9260,  -1845,    668,   2787,  -2255,   2699,  -2512,  -3737,
     -3675,  -3601,  -1803,    210,  -1701,  -1442,  -2700,   3457,
      2868,   2079,  -2113,   3178,   1277,   3578,   5240,  -2482,
      3324,   1020,  -4027,   3835,  -3758,  -3633,  -3170,  -1310,
      2509,  -3110,    713,    174,      0,      0,   -399,   4969,
     -2321,  -7744,   6494,  -3776,   1478,    758,  -1794,  -2233,
     -4059,   4932,   2770,   4761,  -3475,   1243,    829,   -651,
     -5358,   -436,   2381,   1360,   2561,  -3118,    858,  -4366,
      3933,   3646,    -43,  -1310,    -16,    924,   1197,   1415,
     -5036,   -376,      0,      0,    100,   1410,   1290,   3199,
      7091,  -3638,  -2641,   1118,     45,   -441,    794,   -974,
     -5033,    889,    438,  -3102,    895,   3555,   4672,   4795,
      1129,  -2408,  -2153,   1742,    159,  -2040,   7578,  -2006,
     -5737,   1986,  -5568,  -6413,   2428,  -1387,  -2441,    667,
         0,      0,    -37,  -6031,  -4434,   -904,   3290,   1806,
      4736,   2516,  -5905,  -5927,   1754,  -4300,  -2468,  -2203,
     -4836,   -672,   1444,  -1591,  -1631,  -1789,   4311,   -153,
      -688,  -1222,   1058,   3139,   4659,   -353,   1543,   1838,
      2180,  -1448,   2432,   6277,   5304,  -1692,      0,      0,
      -280,   4506,    807,   -477,    823,   3550,   1427,  -1856,
     -3003,  -3501,  -1203,   2679,    933,    778,  -4954,  -1977,
     -7458,   4687,    435,   7045,  -4053,  -3130,    257,  -3917,
     -6165,   1889,    927,    235,   1889,  -1097,   1985,    630,
     -2172,  -2130,   7080,   4810,      0,      0,   -300,    496,
      2808,    279,    667,  -7179,  -2661,   -526,  -2832,   1751,
      2849,   4829,   -906,  -4151,  -1124,  -3062,   8166,   5361,
     -1656,  -6017,   3265,   2551,   -864,   -432,  -6966,   6295,
      -168,    901,    442,   -582,    269,    236,  -3574,    799,
       472,    565,      0,      0,    805,  -2466,   6208,  -4592,
      -170,  -6701,  -5610,   3678,  -4242,   4561,   -724,  -5534,
      2415,   7354,   2761,   2699,   -349,   3822,  -2372,   1756,
     -5523,  -3445,   -588,  -5749,  -3986,   9804,  -3871,   5375,
     -2308,   5504,  -2766,  -1651,   1472,   6832,   2705,  -5104,
         0,      0,   -700,  -1179,   4402,    400,   1383,    939,
     -1342,   6013,   2577,  -3472,    472,   2883,   1450,  -3917,
      2849,   5084,   4990,   5392,    342,  -4925,  -3329,  -5372,
     -2674,  -6035,  -5072,   -836,    179,   2506,   7987,  -3647,
     -8202,  -1437,   1891,   2400,   1607,  -3611,      0,      0,
     -4706,  -4003,   9928,   -379,   5557,   3738,  -8789,    685,
      1937,  -5157,  13388,   7995,  -4119,  -9909,  -5079,   4804,
      5586,    774,  -5430,    299,  -9943,   3264,  -3690,  -3901,
     -1133,  -6199,   3182,   1544,   5467,   3686,  -2639,   4068,
      1163,   -185,  -1299,   -506,      0,      0,    843,   1005,
     -1059,    467,  -1279,  -2259,   6057,  -1694,  -5885,   5342,
     -5160,  -3748,  -1382,   4420,   -697,  -2000,  -3808,   3100,
      2685,  -4073,    531,    318,  -7822,   2414,   2901,   3399,
     -1340,   8449,   3685,    463,  -3341,   2423,   2304,  -2723,
        84,  -2622,      0,      0,  12088,   -265,   2562,   -435,
     -4348,  -2426,   3538,   1552,   1279,    883,  -4166,   2634,
     -6130,   2994,   3729,  -1570,   -601,  -1753,  -5124,  -2788,
     -2096,  -1920,  -2649,   2793,  -1079,  -1952,   2983,  -1530,
      2499,   1769,   1492,  -6757,  -2108,   2841,   1466,   2597,
         0,      0,  -3830,  -4093,   2448,  12720,   7737,   -665,
      -832,  -9257,   2971,  -2400,    791,   1873,   1072,   -587,
     -7440,   8055,   1531,  -4736,    616,  -1782,  -2982,   9663,
     -5057,  -5926,   1610,  -4489,   7033,  -8658,   6010,  -5673,
      5648,    812,   -271,  -1802,  -4500,   4392,      0,      0,
      -888,   -327,   3373,  -1084,   7959,   2430,   1898,  -2360,
     -1820,  -1377,  -1090,  -4436,  -3422,  -1106,  -3230,   3876,
       -41,  -5128,   6375,  -1848,  -3824,   5844,    617,  -1957,
      4232,   1345,  -1439,    -83,   3046,   -214,   5458,  -5566,
     -4387,  -3738,  -5740,   8657,      0,      0,   6978,   6239,
     -3686,   -981,  -2854,     78,   5859,   -357,   4618,   7391,
      -138,    971,  -5799,   2135,   4478,  -7004,  -5949,   1668,
     -6933,  -1163,   7010,  -5624,   2990,   6192,  -8075,   3567,
     -8308,   2236,  -5098,  -2120,  -4355,  -4238,   4955,  10230,
       692,  -5606,      0,      0,  -1348,  -7069,    -12,  -4927,
      1211,    651,   1360,   7744,   3404,   5069,  -2438,   -105,
      2332,   1494,  -4686,   1336,  -3628,   -881,   2474,   1736,
       -26,   -257,   2135,  -4452,    446,   -641,  -4704,   2605,
     -6436,   6662,  -4939,    990,  -1100,  -3782,   5028,   4753,
         0,      0,  -2875,   6410,   3518,   3950,   1271,    869,
     -2842,  -5837,   1532,  -2899,   1140,   -597,   1712,  -1988,
     -4819,  -4783,   4773,  -8796,   2240,  -4596,   3565,  -4853,
      -556,  -3974,   7366,  -4370,   3113,  -3548,   3552,  -5450,
      3869,   2514,   6736,  -4570,   6074,   3151,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,  32767,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,      0,      0,      0,      0,      0,
         0,      0,      0,  32767
};
